package com.xlf.strategy.impl;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.xlf.Enum.LoginTypeEnum;
import com.xlf.dto.SocialTokenDTO;
import com.xlf.dto.SocialUserInfoDTO;
import com.xlf.strategy.config.WxConfigProperties;
import com.xlf.strategy.mode.AbstractSocialLoginStrategyImpl;
import com.xlf.vo.WxLoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;

/**
 * 微信小程序登录实现模块
 */

@Service("wxLoginStrategyImpl")
public class WxLoginStrategyImpl extends AbstractSocialLoginStrategyImpl {

    @Autowired
    WxConfigProperties wxConfigProperties;

    /**
     * 获取登录token，主要功能是通过微信小程序登录凭证（code）调用微信官方接口换取获取用户的会话信息
     * （如 openid、session_key 等）
     * @param data 前端传来的微信登录数据
     * @return  社交登录token
     */
    @Override
    public SocialTokenDTO getSocialToken(String data) {
        WxLoginVO wxLoginVO = JSON.parseObject(data, WxLoginVO.class);

        //可以单独传入http参数，这样参数会自动做URL编码，拼接在URL中，构造请求函数
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("appid", wxConfigProperties.getAppId());       // 小程序唯一标识
        paramMap.put("secret", wxConfigProperties.getAppSecret());  // 小程序密钥
        paramMap.put("js_code", wxLoginVO.getCode());               // 前端获取的code
        paramMap.put("grant_type", "authorization_code");           // 固定值，表示授权类型

        // 使用hutool工具类中的HTTP客户端方法，用于发送GET请求，调用微信登录官方接口，解析结果并封装
        String result= HttpUtil.get(wxConfigProperties.getUrl(), paramMap);
        SocialTokenDTO socialTokenDTO = JSON.parseObject(result, SocialTokenDTO.class);
        socialTokenDTO.setLoginType(LoginTypeEnum.WX.getType());
        System.out.println("微信登录请求结果 ：" + result);
        System.out.println("微信登录返回结果 ：" + socialTokenDTO);
        return socialTokenDTO;
    }


    /**
     * 获取登录用户的信息，用于新增用户时的基础信息绑定；其实就是新增用户时的默认用户信息
     * @param socialTokenDTO 第三方token信息
     * @return  设置了默认名和默认头像的用户对象
     */
    @Override
    public SocialUserInfoDTO getSocialUserInfo(SocialTokenDTO socialTokenDTO) {
        SocialUserInfoDTO socialUserInfoDTO = new SocialUserInfoDTO();
        // 写入默认用户信息
        socialUserInfoDTO.setNickname("默认用户");
        socialUserInfoDTO.setAvatar("http://localhost:8088/foodPricutre/f80a0659b31ede626eac3f627a9bb40f.jpg");
        return socialUserInfoDTO;
    }

}
